Passa al contenuto principale

Sottoprogrammi di utility

Nell'architettura del processore, menzioniamo registri, istruzioni e locazioni di memoria. Quando scriviamo programmi, sfruttiamo però il concetto di terminale, un'interfaccia dove l'utente legge caratteri e ne scrive usando la tastiera. Come questo possa avvenire è argomento di altri corsi, dove verranno presentate le interruzioni, il kernel, e in generale cosa fa un sistema operativo.

In questo corso ci limitiamo a sfruttare queste funzionalità tramite del codice ad hoc contenuto in utility.s. Queste funzionalità sono fornite come sottoprogrammi, che hanno i loro specifici comportamenti da tenere a mente.

Terminologia

Con leggere caratteri da tastiera si intende che il programma resta in attesa che l'utente prema un tasto sulla tastiera, inviando la codifica di quel tasto al programma.

Con mostrare a terminale si intende che il programma stampa un carattere a video.

Con fare eco di un carattere si intende che il programma, subito dopo aver letto un carattere da tastiere, lo mostra anche a schermo all'utente. Questo è il comportamento interattivo a cui siamo più abituati, ma non è automatico.

Con ignorare caratteri si intende che il programma, dopo aver letto un carattere, controlli che questo sia del tipo atteso: se lo è ne fa eco o comunque risponde in modo interattivo,se non lo è ritorna in lettura di un altro carattere, mostrandosi all'utente come se non avesse, appunto, ignorato il carattere precedente.

Caratteri speciali

Avanzamento linea (line feed, LF): carattere \n, codifica 0x0A. Ritorno carrello (carriage return, RF): carattere \r, codifica 0x0D.

Il significato di questi ha a che vedere con le macchine da scrivere, dove avanzare alla riga successiva e riportare il carrello a sinistra erano azioni ben distinte.

Sottoprogrammi

NomeComportamento
incharLegge da tastiera un carattere ASCII e ne scrive la codifica in %al. Non mostra a terminale il carattere letto.
outcharLegge la codifica di un carattere ASCII dal registro %al e lo mostra a terminale.
inbyte / inword / inlongLegge dalla tastiera 2/4/8 cifre esadecimali (0-9 e A-F), facendone eco e ignorando altri caratteri. Salva quindi il byte/word/long corrispondente a tali cifre in %al/%ax/%eax.
outbyte / outword / outlongLegge il contenuto di %al/%ax/%eax e lo mostra a terminale sottoforma di 2/4/8 cifre esadecimali.
indecimal_byte / indecimal_word / indecimal_longLegge dalla tastiera fino a 3/5/10 cifre decimali (0-9), o finché non è inserito un \r, facendone eco e ignorando altri caratteri. Intepreta queste come cifre di un numero naturale, e salva quindi il byte/word/long corrispondente in %al/%ax/%eax.
outdecimal_byte / outdecimal_word / outdecimal_longLegge il contenuto di %al/%ax/%eax, lo interpreta come numero naturale e lo mostra a terminale sottoforma di cifre decimali.
outmessDato l'indirizzo vv in %ebx e il numero nn in %cx, mostra a terminale gli n caratteri ASCII memorizzati a partire da vv.
outlineDato l'indirizzo vv in %ebx, mostra a terminale i caratteri ASCII memorizzati a partire da vv finché non incontra un \r o raggiunge il massimo di 80 caratteri.
inlineDato l'indirizzo vv in %ebx e il numero nn in %cx, legge da tastiera caratteri ASCII e li scrive a partire da vv finché non è inserito un \r o raggiunge il massimo di n2n - 2 caratteri. Pone poi in fondo i caratteri \r\n. Supporta l'uso di backspace per correggere l'input.
newlinePorta l'output del terminale ad una nuova riga, mostrando i caratteri \r\n.